package com.grape.utils;

import com.grape.constants.Constants;
import com.grape.entity.SysOperateLog;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 类描述： 请求对象工具类
 *
 * @author  putao
 * @email   2628279194@qq.com
 */
@Slf4j
public class RequestUtils {

    /**
     * 根据请求对象取出系统信息
     * @param request   请求对象
     * @return          系统信息
     */
    public static List<String> getSystemInfo(HttpServletRequest request){
        String ipAddress = SystemUtils.getIpAddress(request);
        String browserName = SystemUtils.getBrowserName(request).replace(" ", "");
        String osName = SystemUtils.getOsName(request).replace(" ", "");
        List<String> list = new ArrayList<>();
        list.add(ipAddress);
        list.add(browserName);
        list.add(osName);
        log.error("拦截器中输出 真实ip：" + ipAddress);
        log.error("拦截器中输出 浏览器：" + browserName);
        log.error("拦截器中输出 操作系统：" + osName);
        return list;
    }

    public static void getSystemInfo(HttpServletRequest request, SysOperateLog operateLog){
        String ipAddress = SystemUtils.getIpAddress(request);
        String browserName = SystemUtils.getBrowserName(request).replace(" ", "");
        String osName = SystemUtils.getOsName(request).replace(" ", "");
        operateLog.setCreateTime(new Date());
        operateLog.setIp(ipAddress);
    }

    /**
     * 根据请求对象判断类型
     * @param request   请求对象
     * @return          是否为包含类型
     */
    public static boolean checkAgentIsMobile(HttpServletRequest request){
        // 定义移动端请求可能的设备类型
        String[] agent = { "Android", "iPhone", "iPod","iPad", "Windows Phone", "MQQBrowser" };
        String agentStr = request.getHeader("User-Agent");
        if (!agentStr.contains("Windows NT") || (agentStr.contains("Windows NT") && agentStr.contains("compatible; MSIE 9.0;"))) {
            // 排除 苹果桌面系统
            if (!agentStr.contains("Windows NT") && !agentStr.contains("Macintosh")) {
                for (String item : agent) {
                    if (agentStr.contains(item)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    /**
     * 根据请求对象获取token
     * @return  令牌
     */
    public static String getToken(HttpServletRequest request) {
        return request.getHeader(getTokenHeader());
    }

    /**
     * 根据请求对象获取环境标识
     * @return  环境标识
     */
    public static String getEnv(HttpServletRequest request) {
        return request.getHeader(Constants.TOKEN_ENV);
    }

    /**
     * 获取头部token字段值
     * @return      请求头字段
     */
    public static String getTokenHeader() {
        return Constants.TOKEN_HEADER;
    }

    /**
     * 获取uuid请求头值
     * @param request   请求对象
     * @return          请求头uuid的值
     */
    public static String getUUID(HttpServletRequest request) {
        return request.getHeader(Constants.TOKEN_UUID);
    }

    /**
     * 从请求头中获取用户id的值
     * @param request   请求对象
     * @return          请求头用户id的值
     */
    public static String getUserId(HttpServletRequest request) {
        return request.getHeader(Constants.TOKEN_USERID);
    }

}
